/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.ucue.ptc.gco.ui;

import edu.ucue.ptc.gco.mdl.Categoria;
import edu.ucue.ptc.gco.mdl.Lote;
import edu.ucue.ptc.gco.mdl.Producto;
import edu.ucue.ptc.gco.ngc.CategoriaManagerLocal;
import edu.ucue.ptc.gco.ngc.ProductoManagerLocal;
import edu.ucue.ptc.gco.util.AtributoInvalidoException;
import edu.ucue.ptc.gco.util.ElementoYaExisteException;
import java.io.Serializable;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.el.ELContext;
import javax.el.ValueExpression;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import org.primefaces.context.RequestContext;

/**
 *
 * @author Marcelo
 */
@Named(value = "productoAction")
@SessionScoped
public class ProductoAction implements Serializable {

    @Inject
    private ProductoManagerLocal productoManager;
    @Inject
    private CategoriaManagerLocal categoriaManager;
    private boolean modoModificar = false;
    private Producto producto;
    private Categoria categoriaSel;
    private List<Categoria> categorias;
    private Double precio = 0d;
    private Integer cantidad = 0;
    private List<Producto> listaProductos;
    private Producto productoSel;

    public ProductoAction() {
    }

    public static ProductoAction getInstance() {
        ELContext context = FacesContext.getCurrentInstance().getELContext();
        ValueExpression ex = FacesContext.getCurrentInstance().getApplication().getExpressionFactory().
                createValueExpression(context, "#{productoAction}", ProductoAction.class);
        return (ProductoAction) ex.getValue(context);
    }

    @PostConstruct
    public void init() {
        producto = new Producto();

        try {
            categorias = categoriaManager.listarTodos(LoginAction.getUsername(), LoginAction.getPassword());
            cargaLista();
        } catch (AtributoInvalidoException ex) {
            Logger.getLogger(ProductoAction.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(ProductoAction.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public String cancel() {
        return "index";
    }

    public void crearProducto() {
    }

    public String eliminar(Producto productoMod) {
        try {
            productoManager.eliminar(productoMod, LoginAction.getUsername(), LoginAction.getPassword());
            listaProductos.remove(productoMod);
            RequestContext.getCurrentInstance().update("tablaP");
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "Eliminado: " + productoMod.getNombreProducto()));
        } catch (Exception ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "Error al eliminar."));
            Logger.getLogger(ProductoAction.class.getName()).log(Level.SEVERE, null, ex);
        }

        return "";
    }

    public String modificar(Producto productoMod) {
        producto = productoMod;
        categoriaSel = productoMod.getCategoria();
        modoModificar = true;
        return "producto";
    }

    public void cargaLista() {
        try {
            listaProductos = productoManager.listarTodos(LoginAction.getUsername(), LoginAction.getPassword());
        } catch (Exception ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "Error al cargar la lista."));
            Logger.getLogger(ProductoAction.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public String guardar() {
        try {

            producto.setCategoria(categoriaSel);

            if (!modoModificar) {
                Lote lote = new Lote();
                lote.setCantidadInicial(cantidad);
                lote.setCantidadActual(cantidad);
                lote.setProducto(producto);
                lote.setCostoVenta(precio);
                producto.getLotes().add(lote);

                productoManager.crear(producto, LoginAction.getUsername(), LoginAction.getPassword());
                cargaLista();
            } else {
                productoManager.actualizar(producto, LoginAction.getUsername(), LoginAction.getPassword());
            }            
            RequestContext.getCurrentInstance().update("tablaP");
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, "Guardado"));
            return "listaproductos";
        } catch (AtributoInvalidoException ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, ex.getMessage()));
            Logger.getLogger(ProductoAction.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ElementoYaExisteException ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, ex.getMessage()));
            Logger.getLogger(ProductoAction.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(null, ex.getMessage()));
            Logger.getLogger(ProductoAction.class.getName()).log(Level.SEVERE, null, ex);
        }
        return "";
    }
    /*         ProdutosController controller = (ProdutosController)facesContext.getApplication().getELResolver().
     getValue(facesContext.getELContext(), null, "produtosController");
     return controller.ejbFacade.find(getKey(value));
     */

    public void setProducto(Producto producto) {
        this.producto = producto;
    }

    public Producto getProducto() {
        return producto;
    }

    public Categoria getCategoriaSel() {
        return categoriaSel;
    }

    public void setCategoriaSel(Categoria categoriaSel) {
        this.categoriaSel = categoriaSel;
    }

    public List<Categoria> getCategorias() {
        return categorias;
    }

    public void setCategorias(List categorias) {
        this.categorias = categorias;
    }

    public Double getPrecio() {
        return precio;
    }

    public void setPrecio(Double precio) {
        this.precio = precio;
    }

    public Integer getCantidad() {
        return cantidad;
    }

    public void setCantidad(Integer cantidad) {
        this.cantidad = cantidad;
    }

    public List<Producto> getListaProductos() {
        return listaProductos;
    }

    public Producto getProductoSel() {
        return productoSel;
    }

    public void setProductoSel(Producto productoSel) {
        this.productoSel = productoSel;
    }

    public boolean isModoModificar() {
        return modoModificar;
    }

    public void setModoModificar(boolean modoModificar) {
        this.modoModificar = modoModificar;
    }
}
